/**
 * @desc    API请求接口类封装
 * @author  Aquan
 * @date    2019年7月29日17:38:06
 */

//项目后台接口地址
var host = 'http://isp-api.zhxf.ltd';
//url：接口
//postData：参数
//doSuccess：成功的回调函数
//doFail：失败的回调函数
 
//POST请求
function post(type, url, postData, doSuccess, doFail) {
  var headerContent; 
  if(type == 'form'){
    headerContent = 'application/x-www-form-urlencoded'
  }else{
    headerContent = 'application/json;charset=UTF-8'
  }
  request(headerContent, url, postData, "POST", doSuccess, doFail);
}
 
//GET请求
function get(type,url, postData, doSuccess, doFail) {
  var headerContent; 
  if(type == 'form'){
    headerContent = 'application/x-www-form-urlencoded'
  }else{
    headerContent = 'application/json;charset=UTF-8'
  }
  request(headerContent, url, postData, "GET", doSuccess, doFail);
}
 
let isRefreshing = true;
function request(headerContent, url, postData, method, doSuccess, doFail) {
  wx.showLoading({
    title: "正在加载中...",
  })
  wx.request({
    url: host + url, //请求地址
    method: method, //请求方法
    header: { //请求头
      "Content-Type": headerContent,
      'token': wx.getStorageSync("token")
    },
    data: postData, //请求参数    
    dataType: 'json', //返回数据格式
    responseType: 'text', //响应的数据类型
    success: function(res) {
      let result = res.data;
      if(result.code === 401){
        // 将需要重新执行的接口缓存到一个队列中
        addSubscriber(() => {
          request(headerContent, url, postData, method, doSuccess, doFail);
        })
        if (isRefreshing) {
          getNewToken().then(() => {
            // 依次去执行缓存的接口
            onAccessTokenFetched();
            isRefreshing = true;
          })
        }
        isRefreshing = false; 
      }
      wx.hideLoading();
      //成功执行方法，参数值为res.data,直接将返回的数据传入
      doSuccess(res.data);
    },
    fail: function() {
      //失败执行方法
      doFail();
    },
  })
}

// 获取新的token方法
let subscribers = [];
const getNewToken = () => {
  return new Promise((doSuccess, doFail) => {
    wx.getStorage({
      key: 'userInfoStorage',
      success (res) {
        let openid = res.data.openid
        wx.request({
          url: host + '/app/applet/getNewToken', //请求地址
          method: 'GET', //请求方法
          header: { //请求头
            "Content-Type": 'application/x-www-form-urlencoded'
          },
          data: {'openid':openid}, //请求参数    
          dataType: 'json', //返回数据格式
          responseType: 'text', //响应的数据类型
          success: function(data) {
            let result = data.data
            if(result.code === 500){
              wx.showToast({
                title: result.msg,
                icon: 'error',
                duration: 2000
               })
              return ;
            }
            // 存储用户的uid，token
            let userInfoStorage = {
              userId: result.user.id,
              openid: result.user.openid,
              token: result.token
            }
            wx.setStorage({
              key:'userInfoStorage',
              data:userInfoStorage
            })
            wx.setStorageSync("token", result.token)
            // 依次去执行缓存的接口
            onAccessTokenFetched();
            isRefreshing = true;
            doSuccess(data.data);
            wx.hideLoading();
          },
          fail: function() {
            doFail();
            console.error('wx login fail', err);
          },
        })
      }
    });
  })
}
//处理未完成请求保存后面继续执行
function onAccessTokenFetched() {
  subscribers.forEach((callback) => {
    callback();
  })
  subscribers = [];
}

function addSubscriber(callback) {
  subscribers.push(callback)
}
//module.exports用来导出代码
//js文件中通过var http = require("../../util/request.js")加载
module.exports = {
  postRequest: post,
  getRequest: get
}
